package AnalizadorSintactico;

import java.util.ArrayList;

import javax.swing.tree.DefaultMutableTreeNode;

import AnalizadorLexico.Lexema;
import AnalizadorSemantico.SimboloCampo;
import AnalizadorSemantico.SimboloMetodo;
import AnalizadorSemantico.UtilidadesSemanticas;

public class TerminoPotencia {

	private Factor factor;
	private Lexema operador;
	private TerminoPotencia termino;
	private ArrayList<SimboloCampo> tablaCampos;
	private String ambito;
	private ArrayList<SimboloMetodo> tablaMetodos;

	public void setAmbito(String ambito) {
		this.ambito = ambito;
	}

	public void setTablaCampos(ArrayList<SimboloCampo> tablaCampos) {
		this.tablaCampos = tablaCampos;
	}

	public TerminoPotencia(Factor factor, Lexema operador,
			TerminoPotencia termino) {
		this.factor = factor;
		this.operador = operador;
		this.termino = termino;
	}

	@Override
	public String toString() {
		String tp = "";
		if (factor != null) {
			tp += factor.toString();
		}
		if (operador != null) {
			tp += operador.getLexema();
		}
		if (termino != null) {
			tp += termino.toString();
		}
		return tp;
	}

	public DefaultMutableTreeNode getSubArbol() {
		DefaultMutableTreeNode nodo = new DefaultMutableTreeNode("termPot: "
				+ evaluarTipoResultante());
		if (factor != null) {
			DefaultMutableTreeNode factNod = factor.getSubArbol();
			nodo.add(factNod);
		}
		if (operador != null) {
			DefaultMutableTreeNode opNodo = new DefaultMutableTreeNode(
					"op Potencia");
			nodo.add(opNodo);
		}
		if (termino != null) {
			DefaultMutableTreeNode termNod = termino.getSubArbol();
			nodo.add(termNod);
		}
		return nodo;
	}

	public String evaluarTipoResultante() {
		String tipoResultante = "";
		if (termino != null && factor != null) {
			termino.setAmbito(ambito);
			termino.setTablaCampos(tablaCampos);
			termino.setTablaMetodos(tablaMetodos);
			factor.setAmbito(ambito);
			factor.setTablaCampos(tablaCampos);
			factor.setTablaMetodos(tablaMetodos);
			String tipoTermino = termino.evaluarTipoResultante();
			String tipoFactor = factor.evaluarTipoResultante();
			tipoResultante = UtilidadesSemanticas.mayorTipoResultante(
					tipoFactor, tipoTermino);
			return tipoResultante;
		}
		if (factor != null) {
			factor.setAmbito(ambito);
			factor.setTablaCampos(tablaCampos);
			factor.setTablaMetodos(tablaMetodos);
			tipoResultante = factor.evaluarTipoResultante();
			return tipoResultante;
		}
		return tipoResultante;
	}

	public void setTablaMetodos(ArrayList<SimboloMetodo> tablaMetodos) {
		this.tablaMetodos = tablaMetodos;

	}

}
